#include<iostream>
using namespace std;
//malloc和new 的区别
//内置类型方面：new 和malloc 没什么区别

// int main()
// {
//     // int* p1 = new int;
//     // int* p2 = new int[10];//默认不初始化，但是可以初始化

//     int* p1 = new int(10); 
//     //-> (10)这是初始化为10
//     cout <<(*p1)<<'\n';
//     //int* p2 = new int[10]{1,2,3,4};
//     //为什么这样不支持使用范围for呢？
//     //那么因为范围for我们需要知道数组的大小
//     int* p = (int*)malloc(sizeof(int)*10);
//     //我明白这里为什么算的是2了，那是因为p是一个地址
//     //地址在内存中所占的大小取决于是32为环境还是64为环境

//     int size = sizeof(p)/sizeof(p[0]);
//     for(int i = 0;i < size;i++)
//     {
//         //cout << p2[i]<<" ";
//         //*(p2 + i)
//         cout << p[i]<<" ";
//     }
//     return 0;

// }

//总结(n):初始化为n
//[n]数组的大小是n


//验证对于自定义类型 malloc和new 的区别
// class Myclass
// {
// public:
//    Myclass()
//    {
//     cout << "Myclass()"<<'\n';
//    }
//    ~Myclass()
//    {
//     cout << "~Myclass"<<'\n';
//    }
//    void Print()
//    {
//     cout <<this <<" ";
//    }
// private:
//    int _a;
// };
// int main()
// {
//     Myclass* m1 = new Myclass();
//     m1->Print();
//     cout << m1<<'\n';
//     Myclass* m2 = (Myclass*)malloc(sizeof(Myclass));
//     //通过上面的例子：我们可以得出：
//     //对于自定义类型 new = operator new + 构造函数
//     //free(m2);
//     //delete m1;
//     return 0;

// }
// //这串代码不会调用析构函数的原因：
// //我们在堆空间上找一块空间：存放对象的地址

// //对象的声明周期结束时：会自动调用析构函数 -> 这是对于在栈空间上的对象而言
// //对于堆上的空间需要我们自己手动进行释放

//析构函数的顺序：后创建 先析构
//operator new 和  operator delete
//new 和 delete 是用户进行动态内存申请和释放的操作符
//operator new 和 operator delete是系统提供的全局函数
//new 在底层是调用operator new 全局函数来申请空间的
//                                    来释放空间的 

//全局变量和static 修饰的静态变量创建的时间

//全局变量初始化时机：main函数前
//局部静态变量初始化的时机：第一次执行到声明处

//析构函数的循序：后定义的，先析构

//全局变量和static 修饰的变量的区别:
